# 桥接模式

# =>⭐将抽象部分与它的实现部分分离，使它们都可以独立地变化。

# 桥接模式结构中包含如下角色：
# 1. Abstraction（抽象类）：定义抽象的接口，声明了对实现部分的引用。
# 2. RefinedAbstraction（扩充抽象类）：扩充了抽象类，实现了具体的业务逻辑。
# 3. Implementor（实现类接口）：定义实现类的接口，声明了实现类的具体功能。
# 4. ConcreteImplementor（具体实现类）：实现了实现类的接口，实现了具体的功能。
# 5. Client（客户端）：使用Abstraction接口与Implementor接口进行交互。

# => ⭐在两个变化维度中任意扩展一个维度，都不需要修改原有系统

from abc import ABC, abstractmethod

# 渲染接口（Implementor）
class IRenderer(ABC):
    @abstractmethod
    def render_shape(self, shape):
        pass

# 具体渲染实现（Concrete Implementor）
class OpenGLRenderer(IRenderer):
    def render_shape(self, shape):
        print(f"OpenGL: Rendering {shape.__class__.__name__} with color {shape.color}")

class DirectXRenderer(IRenderer):
    def render_shape(self, shape):
        print(f"DirectX: Rendering {shape.__class__.__name__} with color {shape.color}")

# 抽象形状类（Abstraction）
class Shape:
    def __init__(self, renderer):
        self.renderer = renderer
        self.color = None

    def draw(self):
        self.renderer.render_shape(self)

# 具体形状实现（Refined Abstraction）
class Circle(Shape):
    def __init__(self, renderer):
        super().__init__(renderer)

class Square(Shape):
    def __init__(self, renderer):
        super().__init__(renderer)

# 客户端代码
if __name__ == "__main__":
    opengl_renderer = OpenGLRenderer()
    directx_renderer = DirectXRenderer()

    circle1 = Circle(opengl_renderer)
    circle1.color = "Red"
    circle2 = Circle(directx_renderer)
    circle2.color = "Blue"
    square1 = Square(opengl_renderer)
    square1.color = "Green"
    square2 = Square(directx_renderer)
    square2.color = "Yellow"

    circle1.draw()
    circle2.draw()
    square1.draw()
    square2.draw()